/*
 Trabajo Practico 2 Ejercicio 5
 Servidor
 Cuarta entrega

 - Integrantes:
        - Martinez, Guillermo 		DNI: 34510461
        - Rodriguez, Lucas			DNI: 34265017
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <limits.h>

pid_t consum1=0,consum2=0;

void term_handler(int);

char nombreFifo[1024] = "rm ";

void main(int argc, char *argv[])
{
	int ret_val,ingreso=0;
	char ingreso2[6]={'\0'};
	FILE* fifo;

    if(argc == 2)
        strcat(nombreFifo,argv[1]);
    else
        exit (1);

	if(argc != 2)
		exit(printf("Argumentos inválidos, ingrese nombre de FIFO\n"));

	signal(SIGTERM,term_handler);
	signal(SIGINT,term_handler);

	// Creacion de Pipe
	ret_val = mkfifo(argv[1],0666);

	// Apertura pipe como Lectura para leer PID clientes
	fifo = fopen(argv[1], "r");
	fscanf(fifo,"%d-%d-",&consum1,&consum2);
	fclose(fifo);
	printf("Cliente PID: %d conectado.\n",consum1,consum2);

	// Por superposición de envíos
	if(consum2 == 0)
	{
	   fifo = fopen(argv[1], "r");
	   fscanf(fifo,"%d\n",&consum2);
	   fclose(fifo);
	   printf("Cliente PID: %d conectado.\n",consum2);
	}
	
	else
		printf("Cliente PID: %d conectado.\n",consum2);
			
	/* 1 */
	sleep(1);
	kill(consum1,SIGUSR2);
	kill(consum2,SIGUSR2);

	// Ciclo principal
	while(1)
	{
		// Abro en modo escritura
		fifo = fopen(argv[1], "w");
		printf("Ingrese un número: ");
		do
		{
			fflush(stdin);			
			scanf("%s",ingreso2);
			ingreso=atoi(ingreso2);
		}while(ingreso < INT_MIN || ingreso > INT_MAX);

		fprintf(fifo,"%d-",ingreso);
		
		// Si es impar lo mando al 2do cliente
		if(ingreso%2)
			kill(consum2,SIGUSR1);
		else
			kill(consum1,SIGUSR1);

		fclose(fifo);
	}
	fcloseall();
}

void term_handler(int signal)
{
	// Envio señales a clientes
	if(consum1)
	{
		kill(consum1,SIGTERM);
		wait(NULL);
	}
	
	if(consum2)
	{
		kill(consum2,SIGTERM);
		wait(NULL);
	}

	// Cierro flujos
   fcloseall();
	printf("\nTerminando...\n");
   system(nombreFifo);
   exit(0);
}
